package files;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collection;

import maquina.LocalProperties;

public class GridMonitorFileManager {

	    public static void saveInformation(String filename, String information){
			try {
	            //Insere as informações do usuário do peer no arquivo local.
				PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(filename,true)));
				
				pw.println(information);
				
				pw.close();
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
		
		public static void clearInformation(String filename){
			try {
				RandomAccessFile raf = new RandomAccessFile(new File(filename), "rw");
				raf.setLength(0);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
				
		public static String retrieveInformation(String filename){
			String informationList = null;
			try{
				RandomAccessFile raf = new RandomAccessFile(new File(filename), "rw");
				
				int contador = 0;
				while(raf.readLine() != null){
					contador++;
				}
				//volta para o início do arquivo
				raf.seek(0);
				
				
				Collection<String> lista = new ArrayList<String>();
				int i = 0;
				while(i < contador){
					String linha = raf.readLine();
					lista.add(linha);
					i++;
				}
				
				if(lista.size() > 0){
					int cont = 1;
					informationList = lista.size()+LocalProperties.separador; //QuantidadeUsuarios
					for (String linha : lista) { //Para cada registro na lista
						if(cont == lista.size()){
							informationList = informationList + linha;						
						} else{
							informationList = informationList + linha + LocalProperties.separador;
						}
						cont++;
					}
				} 
			}catch(IOException e){
				e.printStackTrace();
			}
			return informationList; 
		}
		
        public static boolean isEmptyList(String filename) throws IOException, FileNotFoundException{
        	RandomAccessFile raf = new RandomAccessFile(new File(filename), "rw");
        	boolean result = false;
        	
        	if(raf.length() == 0){ //Se estiver vazio...
        		result = true;
        	}
        
        	return result;
        }
      
        public static void removeNodesFromList(String node){
			try {
				RandomAccessFile raf = new RandomAccessFile(new File(LocalProperties.filenameNodesList), "rw");
				
				//Pega a quantidade de registros salvos no arquivo...
				int contador = 0;
				while(raf.readLine() != null){
					contador++;
				}
				
				//volta para o início do arquivo
				raf.seek(0);
				
				Collection<String> lista = new ArrayList<String>();
				
				//Procura entre os registros, se existe o nó informado. Os registros que não interessam são salvos em outra lista...
				int i = 0;
				while(i < contador){
					String linha = raf.readLine();
					if(!linha.equals(node)){
						lista.add(linha);
					}
					i++;
				}
				
				
				//Clear all node's list
				clearInformation(LocalProperties.filenameNodesList);
				
				//Adiciona à lista os nós já conhecidos...
				for (String linha: lista) {
					String atualNode[] = linha.split(LocalProperties.separador);
					
					saveInformation(LocalProperties.filenameNodesList, node);
				}
				
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
        
        public static void enviarArquivo(String path){
        	     File f = new File(path);  
        	     try {  
        	       InetAddress address = InetAddress.getLocalHost();
        	       enviarArquivo(f, address);
        	       
        	     } catch(Exception e) {  
        	       e.printStackTrace();  
        	     }  
        }

		public static void enviarArquivo(File f, InetAddress address){
			try{
			   Socket socket = new Socket(address, LocalProperties.fileTransferExternalPort);  
			   ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());  
			     
			   out.writeUTF(f.getName());  
			   out.writeLong(f.length());  
			   
			   FileInputStream in = new FileInputStream(f);  
			   
			   byte[] buf = new byte[4096];  
			     
			   while(true) {  
			     int len = in.read(buf);  
			     if(len == -1) break;  
			     out.write(buf, 0, len);   
			   }  
			   
			   out.close();  
			   socket.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
}
